console.log("Writable streams 是 destination 的一种抽象，一个writable流指的是只能流进不能流出的流，见图writerStream.png");
console.log("数据流过来的时候，会直接写入到资源池，当写入速度比较缓慢或者写入暂停时，" +
    "数据流会进入队列池缓存起来,当生产者写入速度过快，把队列池装满了之后，就会出现「背压」(back pressure)，" +
    "这个时候是需要告诉生产者暂停生产的，当队列释放之后，Writable Stream 会给生产者发送一个 drain 消息，让它恢复生产");

function writeOneMillionTimes(writer, data, encoding, callback) {
  let i = 10000;
  write();

  function write() {
    let ok = true;
    while (i-- > 0 && ok) {
      // 写入结束时回调
      if (i === 0) {
        writer.write(data, encoding, callback)//当最后一次写入数据即将结束时，再调用callback
      } else {
        ok = writer.write(data, encoding)//写数据还没有结束，不能调用callback
      }
    }
    if (i > 0) {
      // 这里提前停下了，'drain' 事件触发后才可以继续写入
      console.log('drain', i);
      writer.once('drain', write);
    }
  }
}

const Writable = require('stream').Writable;

class MyWritableStream extends Writable {
  constructor(options) {
    super(options)
  }

  _write(chunk, encoding, callback) {
    setTimeout(() => {
      callback(null)
    }, 0)

  }
}

let writer = new MyWritableStream();
writeOneMillionTimes(writer, 'simple', 'utf8', () => {
  console.log('end');
});



